
#include "Interfaz.h"

Interfaz::Interfaz()
{
    clientes = new Cola<Cliente>();
    super = new Supermercado();
}

Interfaz::Interfaz(const Interfaz& orig)
{
    
}
Interfaz::~Interfaz()
{
    delete clientes;
    delete super;
}

int Interfaz::compruebaInt(char *str)
{
    while(!isdigit(str[0]))
    {
        cout<<"No se ha introducido un numero\n";
        cout<<"Vuevla a introducirlo por favor\n\n";
        cout<<"-> ";
        cin>>str;
    }
    return atoi(str);
}

void Interfaz::menu()
{
    char check[2];
    int opcion;
    
    do
    {
        clean();
        cout<<endl;
        cout<<"\t [1] Administracion del Supermercado\n";
        cout<<"\t [2] Administracion del Cliente\n";
        cout<<"\t [3] Salir\n";
        cout<<"\t -> ";
        
        cin>>check;
        opcion = compruebaInt(check);
        
        switch(opcion)
        {
            case 1:
                menuSupermercado();
                break;
            case 2:
                menuCliente();
                break;
            case 3:
                break;
            default:
                cout<<"No se escogio un numero correcto";
                cout<<"Presione una tecla para continuar";
                cin.get();
        }
        
    }while(opcion != 3);
}

void Interfaz::menuSupermercado()
{
    char check[2];
    int opcion;
    
    do
    {
        clean();
        cout<<endl;
        cout<<"\t [1] Pasillos\n";
        cout<<"\t [2] Tipo de Productos\n";
        cout<<"\t [3] Productos\n";
        cout<<"\t [4] Atras\n";
        cout<<"\t -> ";
        
        cin>>check;
        opcion = compruebaInt(check);
        
        switch(opcion)
        {
            case 1:
                menuPasillo();
                break;
            case 2:
                menuTipoProducto();
                break;
            case 3:
                menuProducto();
                break;
            case 4:
                
                break;
            default:
                cout<<"No se escogio un numero correcto";
                cout<<"Presione una tecla para continuar";
                cin.get();
        }
        
    }while(opcion != 4);
}

void Interfaz::menuPasillo()
{
   char check[2];
    int opcion;
    
    do
    {
        clean();
        cout<<endl;
        cout<<"\t [1] Insertar Pasillo\n";
        cout<<"\t [2] Eliminar Pasillo\n";
        cout<<"\t [3] Intercambiar Pasillos\n";
        cout<<"\t [4] Mostrar Pasillos\n";
        cout<<"\t [5] Atras\n";
        cout<<"\t -> ";
        
        cin>>check;
        opcion = compruebaInt(check);
        
        switch(opcion)
        {
             case 1:
                if(this->insertarPasillo())
                    cout<<"\n\t Se inserto el pasillo correctamente!";
                else
                    cout<<"\n\t No se pudo insertar el pasillo!";
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
                break;
            case 2:
                
                if(this->eliminarPasillo())
                    cout<<"\n\t Se elimino el pasillo correctamente!";
                else
                    cout<<"\n\t No se pudo eliminar el pasillo!";
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
                break;
            case 3:
                
                if(this->intercambiarPasillo())
                    cout<<"\n\t Se elimino intercambiaron los pasillos correctamente!";
                else
                    cout<<"\n\t No se pudieron intercambiar los pasillos!";
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
                
                break;
            case 4:
                
                this->mostrarPasillo();
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
                break;
            case 5:
                break;
            default:
                cout<<"No se escogio un numero correcto";
                cout<<"Presione una tecla para continuar";
                cin.get();
                cin.ignore();
        }
        
    }while(opcion != 5); 
}

bool Interfaz::insertarPasillo()
{
    string nombre;
    int pos;
    clean();
    cout<<endl<<"\t Escriba el nombre del pasillo: ";
    cin>>nombre;
    
    cout<<endl<<"\t Escriba la posicion del pasillo: ";
    cin>>pos;
    if(pos<=0 || pos>super->getPasillos()->getCantidad()+1)
    {
        cout<<"\n\tNo es una posicion valida\n";
        return false;
    }
    
    Pasillo *pas = new Pasillo(nombre, pos);
    super->getPasillos()->insertarPos(pos, pas);
    
    return true;
}

bool Interfaz::eliminarPasillo()
{
    int pos;
    clean();
 
    cout<<endl<<"\t Escriba la posicion en la que va a eliminar el pasillo: ";
    cin>>pos;
    if(pos<=0 && pos>super->getPasillos()->getCantidad())
    {
        cout<<"\n\tNo es una posicion valida\n";
        return false;
    }
    
    super->getPasillos()->eliminarPos(pos);
    
    return true;
}

bool Interfaz::intercambiarPasillo()
{
    int posA;
    int posB;
    clean();
    cout<<endl<<"\t Escriba la posicion del primer pasillo: ";
    cin>>posA;
    cout<<endl<<"\t Escriba la posicion del segundo pasillo: ";
    cin>>posB;
    if(posA<=0 || posA > super->getPasillos()->getCantidad() || posB<=0 || posB > super->getPasillos()->getCantidad())
    {
        cout<<"\n\tNo es una posicion valida\n";
        return false;
    }
   
    super->getPasillos()->intercambiar(posA, posB);
    
    return true;
}

bool Interfaz::mostrarPasillo()
{
    clean();
    cout<<super->getPasillos()->toString();
    return true;
}


void Interfaz::menuTipoProducto()
{
   char check[2];
    int opcion;
    
    do
    {
        clean();
        cout<<endl;
        cout<<"\t [1] Insertar Tipo de Producto\n";
        cout<<"\t [2] Eliminar Tipo de Producto\n";
        cout<<"\t [3] Intercambiar Tipo de Producto\n";
        cout<<"\t [4] Mostrar Tipos de Productos\n";
        cout<<"\t [5] Atras\n";
        cout<<"\t -> ";
        
        cin>>check;
        opcion = compruebaInt(check);
        
        switch(opcion)
        {
            case 1:
                if(this->insertarTipoProducto())
                    cout<<"\n\t Se inserto el Tipo de producto con exito!\n";
                else
                    cout<<"\n\t No se pudo insertar el Tipo de producto!\n";
                
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
              
                break;
            case 2:
                if(this->eliminarTipoProducto())
                    cout<<"\n\t Se elimino el Tipo de producto con exito!\n";
                else
                    cout<<"\n\t No se pudo eliminar el Tipo de producto!\n";
                
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
                break;
            case 3:
                if(this->intercambiarTipoProducto())
                    cout<<"\n\t Se intercambiaron los Tipos de productos con exito!\n";
                else
                    cout<<"\n\t No se pudieron intercambiar los Tipo de productos!\n";
                
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
                break;
            case 4:
                this->mostrarTipoProducto();
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
                break;
            case 5:
                break;
            default:
                cout<<"No se escogio un numero correcto";
                cout<<"Presione una tecla para continuar";
                cin.get();
        }
        
    }while(opcion != 5); 
}

bool Interfaz::insertarTipoProducto()
{
    int num;
    int pos;
    string nombre;
    
    clean();
    
   
    cout<<"\n\t Numero de pasillo al que desea agregar el tipo de producto\n";
    cout<<"\t -> ";
    cin>>num;
    if(super->getPasillos()->buscar(num) == NULL)
    {
         cout<<"\n\t El pasillo "<<num<<" no existe";
         return false;
    }


    cout<<"\n\t Escriba el nombre del tipo de producto: ";
    cin>>nombre;
    if(super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)!=NULL)
    {
        cout<<"\n\t El tipo de producto "<<nombre<<" ya existe";
        return false;
    }
 
    
    cout<<"\n\t Escriba la posicion del tipo de producto: ";
    cin>>pos;
    if(pos<=0 || pos> super->getPasillos()->buscar(num)->getListaCircular()->getCantidad()+1)
    {
        cout<<"\n\t La posicion es invalida\n";
        return false;
    }

    TipoProducto* tipo = new TipoProducto(nombre);
    super->getPasillos()->buscar(num)->getListaCircular()->insertarPos(pos, tipo);
}

bool Interfaz::eliminarTipoProducto()
{
    int pos;
    int num;
    clean();

    cout<<"\n\t Numero de pasillo al que desea eliminar el tipo de producto\n";
    cout<<"\t -> ";
    cin>>num;
    if(super->getPasillos()->buscar(num) == NULL)
    {
         cout<<"\n\t El pasillo "<<num<<" no existe";
         return false;
    }


    cout<<endl<<"\t Escriba la posicion en la que va a eliminar el tipo: ";
    cin>>pos;
    if(pos<=0 || pos>super->getPasillos()->buscar(num)->getListaCircular()->getCantidad())
    {
        cout<<"\n\tNo es una posicion valida\n";
        return false;
    }

    super->getPasillos()->eliminarPos(pos);
    
    return true;
    
}

bool Interfaz::intercambiarTipoProducto()
{
    int posA;
    int posB;
    int num;
    clean();
    
    cout<<"\n\t Numero de pasillo al que desea intercambiar tipos\n";
    cout<<"\t -> ";
    cin>>num;
    if(super->getPasillos()->buscar(num) == NULL)
    {
         cout<<"\n\t El pasillo "<<num<<" no existe";
         return false;
    }

    cout<<endl<<"\t Escriba la posicion del primer pasillo: ";
    cin>>posA;
    if(posA<0 || posA > super->getPasillos()->buscar(num)->getListaCircular()->getCantidad() )
    {
        cout<<"\n\tNo es una posicion valida\n";
        return false;
    }
    cout<<endl<<"\t Escriba la posicion del segundo pasillo: ";
    cin>>posB;
    if( posB<0 || posB > super->getPasillos()->buscar(num)->getListaCircular()->getCantidad())
    {
        cout<<"\n\tNo es una posicion valida\n";
        return false;
    }
    super->getPasillos()->buscar(num)->getListaCircular()->intercambiar(posA, posB);
    
    return true;
}

bool Interfaz::mostrarTipoProducto()
{
    clean();
    cout<<super->getPasillos()->toString();
    return true;
}

void Interfaz::menuProducto()
{
   char check[2];
    int opcion;
    
    do
    {
        clean();
        cout<<endl;
        cout<<"\t [1] Insertar Producto\n";
        cout<<"\t [2] Eliminar Producto\n";
        cout<<"\t [3] Intercambiar Producto\n";
        cout<<"\t [4] Mostrar Productos\n";
        cout<<"\t [5] Atras\n";
        cout<<"\t -> ";
        
        cin>>check;
        opcion = compruebaInt(check);
        
        switch(opcion)
        {
            case 1:
                if(this->insertarProducto())
                    cout<<"\n\t Se inserto el producto con exito!\n";
                else
                    cout<<"\n\t No se pudo insertar el producto!\n";
                
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
              
                break;
            case 2:
                if(this->eliminarProducto())
                    cout<<"\n\t Se elimino el producto con exito!\n";
                else
                    cout<<"\n\t No se pudo eliminar el producto!\n";
                
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
                break;
            case 3:
                if(this->intercambiarProducto())
                    cout<<"\n\t Se intercambiaron los productos con exito!\n";
                else
                    cout<<"\n\t No se pudieron intercambiar los productos!\n";
                
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
                break;
            case 4:
                this->mostrarProducto();
                cout<<"\nPresione una tecla para continuar";
                cin.get();
                cin.ignore();
                break;
            case 5:
                break;
            default:
                cout<<"No se escogio un numero correcto";
                cout<<"Presione una tecla para continuar";
                cin.get();
        }
        
    }while(opcion != 5); 
}

bool Interfaz::insertarProducto()
{
    int num;
    int pos;
    string nombre;
    clean();
    
    cout<<"\n\t Numero de pasillo al que desea agregar el producto\n";
    cout<<"\t -> ";
    cin>>num;
    if(super->getPasillos()->buscar(num) == NULL)
    {
         cout<<"\n\t El pasillo "<<num<<" no existe";
         return false;
    }


    cout<<"\n\t Escriba el nombre del tipo de producto al que desea agregar el producto: ";
    cin>>nombre;
    if(super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)==NULL)
    {
        cout<<"\n\t El tipo de producto "<<nombre<<" no existe";
        return false;
    }

    
    string marca;
    string id;
    string opcion;
    
    cout<<"\n\t Escriba el id del producto: ";
    cin>>id;
    
    Producto* aux = super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)->getLista()->buscar(id);
    if( aux != NULL)
    {
        cout<<"\n\t El producto con el id "<<id<<" ya existe: "<<endl;
        aux->toString();
        cout<<"\n\t Desea agregar el mismo producto? (si/otro para no): ";
        cin>>opcion;
        if(opcion == "si" || opcion == "Si")
        {
            int cant;
            cout<<"\n\t Escriba la cantidad de veces: ";
            cin>>cant;
            aux->aumentar(cant);
            return true;
        }
        else 
            return false;
    }
    else
    {
    
        cout<<"\n\t Escriba la marca del producto: ";
        cin>>marca;
        cout<<"\n\t Escriba la posicion del producto: ";
        cin>>pos;
        Producto* p = new Producto(marca, id, true);
        super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)->getLista()->insertarPos(pos, p);
        return true;
    }
}

bool Interfaz::eliminarProducto()
{
    int num;
    int pos;
    string nombre;
    clean();
    
    cout<<"\n\t Numero de pasillo al que desea eliminar el producto\n";
    cout<<"\t -> ";
    cin>>num;
    if(super->getPasillos()->buscar(num) == NULL)
    {
         cout<<"\n\t El pasillo "<<num<<" no existe";
         return false;
    }


    cout<<"\n\t Escriba el nombre del tipo de producto al que desea agregar el producto: ";
    cin>>nombre;
    if(super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)==NULL)
    {
        cout<<"\n\t El tipo de producto "<<nombre<<" no existe";
        return false;
    }

    
    cout<<super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)->getLista()->toString();
    
    cout<<"\n\t Escriba la posicion del producto: ";
    cin>>pos;
    
    if(pos<0 || pos > super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)->getLista()->getCantidad())
    {
        cout<<"\n\t Posicion invalida";
        return false;
    }
    else
    {
        super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)->getLista()->eliminarPos(pos);
        return true;
    }
}

bool Interfaz::intercambiarProducto()
{
    int num;
    int posA;
    int posB;
    string nombre;
    clean();
    
    cout<<"\n\t Numero de pasillo al que desea intercambiar productos\n";
    cout<<"\t -> ";
    cin>>num;
    if(super->getPasillos()->buscar(num) == NULL)
    {
         cout<<"\n\t El pasillo "<<num<<" no existe";
         return false;
    }


    cout<<"\n\t Escriba el nombre del tipo de producto: ";
    cin>>nombre;
    if(super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)==NULL)
    {
        cout<<"\n\t El tipo de producto "<<nombre<<" no existe";
        return false;
    }

    
    cout<<super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)->getLista()->toString();
    
    cout<<"\n\t Escriba la posicion del primer producto: ";
    cin>>posA;
    cout<<"\n\t Escriba la posicion del segundo producto: ";
    cin>>posB;
    
    if(posA<0 || posA > super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)->getLista()->getCantidad())
    {
        cout<<"\n\t Posicion invalida";
        return false;
    }
    if(posB<0 || posB > super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)->getLista()->getCantidad())
    {
        cout<<"\n\t Posicion invalida";
        return false;
    }
    
    super->getPasillos()->buscar(num)->getListaCircular()->buscar(nombre)->getLista()->intercambiar(posA, posB);
    return true;
    
}

bool Interfaz::mostrarProducto()
{
    clean();
    cout<<super->getPasillos()->toString();
    return true;
}

void Interfaz::menuCliente()
{
    char check[2];
    int opcion;
    
    do
    {
        clean();
        cout<<endl;
        cout<<"\t [1] Crear cliente nuevo\n";
        cout<<"\t [2] Empezar a comprar con "<<clientes->getCantidad()<<" clientes\n";
        cout<<"\t [3] Atras\n";
        cout<<"\t -> ";
        
        cin>>check;
        opcion = compruebaInt(check);
        
        switch(opcion)
        {
            case 1:
                //insertar
                break;
            case 2:
                //comenzar
                break;
            case 3:
                
                break;
            default:
                cout<<"No se escogio un numero correcto";
                cout<<"Presione una tecla para continuar";
                cin.get();
        }
        
    }while(opcion != 3); 
}
